Sprawdzenie aktualnego skina [WinXP] ;)

mitring

Przy pisaniu mojej pracy dyplomowej chcialem, aby program sprawdzil z jakim systemem operacyjnym ma do czynienia i jak jest to XP to musi sprawdzic jaki skin jest aktywny ;P

unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, ComObj, ComCtrls, jpeg, ExtCtrls;

type
  TForm1 = class(TForm)
    SpeedButton1: TSpeedButton;
    Label1: TLabel;
    TrackBar1: TTrackBar;
    Label2: TLabel;
    Image1: TImage;
    procedure SpeedButton1Click(Sender: TObject);
    procedure TrackBar1Change(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    function GetXPTheme(): string;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

  IsThemeActive      : function: BOOL cdecl stdcall;
  GetCurrentThemeName: function(pszThemeFileName: PWideChar;
                                cchMaxNameChars: Integer;
                                pszColorBuff: PWideChar;
                                cchMaxColorChars: Integer;
                                pszSizeBuff: PWideChar;
                                cchMaxSizeChars: Integer): THandle cdecl stdcall;

implementation

{$R *.dfm}
{$R WindowsXP.res}

{ Sprawdzenie skina i wyprowadzenie nazwy }
function TForm1.GetXPTheme: string;
var
  Theme : THandle;
  FileName, ColorScheme, SizeName: WideString;
begin
  Theme := 0;
  Result := 'xpNone';
  try
    Theme := LoadLibrary('uxTheme.dll');

    if Theme > 0 then begin
      IsThemeActive := GetProcAddress(Theme, 'IsThemeActive');

      if Assigned(IsThemeActive) then
        if IsThemeActive then begin
          GetCurrentThemeName := GetProcAddress(Theme, 'GetCurrentThemeName');
          if Assigned(GetCurrentThemeName) then begin
            SetLength(FileName   , 255);
            SetLength(ColorScheme, 255);
            SetLength(SizeName   , 255);
            OleCheck(GetCurrentThemeName(PWideChar(FileName), 255, PWideChar(ColorScheme), 255, PWideChar(SizeName), 255));
            if (PWideChar(ColorScheme) = 'NormalColor') then
              Result := 'xpBlue'
            else if (PWideChar(ColorScheme) = 'HomeStead') then
              Result := 'xpOlive'
            else if (PWideChar(ColorScheme) = 'Metallic') then
              Result := 'xpSilver'
            else
              Result := 'xpNone';
          end;
        end;
    end;
  finally
    if Theme <> 0 then FreeLibrary(Theme);
  end;
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  Label1.Caption := GetXPTheme; // wyswietla nazwe Skina np. xpBlue
end;

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
  Form1.AlphaBlendValue := TrackBar1.Position;
  Caption               := ':: CheckSkin :: Blend: ' + IntToStr(TrackBar1.Position);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Form1.AlphaBlend      := True;
  Form1.AlphaBlendValue := TrackBar1.Position;
  Caption               := ':: CheckSkin :: Blend: ' + IntToStr(TrackBar1.Position);
end;

end.

Mam nadzieje, ze komus moze sie to przyda ;)

Zrodelko ;) jak nie dziala link na 4P to z innego serwera ;)
Przykladzik

4 komentarzy

hmm a nie wie ktoś, jak wybierać style z poziomu aplikacji?? I chodzi mi zwłaszcza o te niemicrosoftowe

co za problem :). mozna ten kawalek:

        if (PWideChar(ColorScheme) = 'NormalColor') then

(...)
Result := 'xpNone';

zastapic tym:

        if (PWideChar(ColorScheme) = 'NormalColor') then

(...)
Result := PWideChar(ColorScheme);

a nawet sprawdzic jak sie zwie xpNone i tez jako warunek dodac, ale mi sie nie chce, bo szukam czegos innego :P

Bralem pod uwage tylko dostepne domyslnie schemaciki ;)

No nie do końca ;P, bo co jeśli doinstaluje dodatkowy schemat? Mogę dać tylko 5 :)